RiverSync
SPEC-APP-PTL · v0.24
2 July 2026
Owner: Platform team

Portal — product requirements

portal.riversync.com — customer device monitoring: live telemetry, configuration and connection health for every RiverSync converged micro data center across your sites, whatever its model, plus the service that keeps it running.

DraftPrototyped
Inherits the master PRD. Tenancy, identity, authorization and partner agreements are defined in SPEC-PRD. Roles for this app are assigned in Account's per-application matrix (SPEC-APP-ACC ACC-2). The device registry, telemetry plane and schema model are owned by the Devices domain (SPEC-DDD-DVC); the Portal is its primary read client. The build-ready UI of the three monitoring surfaces — the device inventory, the device detail and alerts & alarms — is specified to every control, state and realtime contract in SPEC-UIX-DEV.

1Devices the Portal monitors

RiverSync ships three product families across six models. The fleet is heterogeneous — generations, series and module counts differ — so telemetry shape differs by family and model. Every device on a customer's sites appears in the Portal regardless of family.

FamilyModelsIn the fieldTelemetry schema
frigo 20 · frigo 30Edge / small-site enclosuresRefrigeration family — established shape
koelkast 20 · koelkast 30Larger enclosures, more cooling modulesRefrigeration family — wider module set
nevera 30 · nevera 40Newest generation new to the modelNewer generation/series — additional fields

2Telemetry data source

Product-facing summary only — the pipeline, schema registry and storage strategy are specified in the Devices domain (SVC-DVC, SVC-9). The Portal does not own this data; it reads it.

Each device emits three independent streams to RiverSync's ingest plane (mTLS, never through the user gateway): telemetry (the live readings), the device twin (reported state + desired configuration), and connection (online/offline transitions). Readings land in a time-series store outside the relational model — the ⚠ the ERD records under PTL-1 — and only Alert rows cross into Postgres. A device catalog maps each unit to its (family, schema-version) so the Portal renders the right metrics per device; a device with no registered schema is read unknown-safe — never silently null-mapped (see PTL-7).

3Requirements

PTL-1

Live device monitoring — the device list and per-device telemetry (temperature, power, PUE and per-module readings), health states and alert/alarm streams across all site locations. Devices is the Portal landing surface — there is no separate dashboard. Values stream live and tween in the UI; deltas shown are factual. Telemetry is served from the time-series store, not Postgres (the ERD ⚠). On device detail, the readings are read as a single full-width multi-metric time-series stack (one card, the DS TimeSeriesStack): several panes share one time axis with a synchronized crosshair, one overview brush for the whole period, and a header carrying event-milestone annotations (toggle), a Live / Paused control and a time-scale selector (5m · 30m · 1h · 1d · 1mo · 1y · 3y). The refrigeration schema stacks three panes — (1) air temperature & humidity: return-air, supply-air and ambient air on the left °C axis (with the setpoint band) and humidity on the right %RH axis (40–55% band); (2) power draw & COP: metered power (kW, area) on the left and the cooling COP on the right; (3) door access: the enclosure's front · back · side doors as open→close state bands that escalate to alarm past the 5-min threshold (a single door never opens again while already open). Event milestones line up across every pane. The converged/Nevera schema renders the same three panes plus its extra tiles (PUE, battery, bus voltage). Build-ready detail in SPEC-UIX-DEV §7.

PTL-2

Alarms are actionable — acknowledge, see cause and effect ("MDC-6610 return air at 41.4°C — 6.4°C above setpoint"), and open a ticket from the alarm. Alarms are read on the device detail's Alarms tab, scoped to that device — there is no standalone Alerts & alarms page (removed, prototype Jul 2026); cross-device alarm context is surfaced through the device list's attention ranking and the top-bar notification bell.

PTL-3

Per-device maintenance visibility — on the device detail's Maintenance tab (there is no standalone Maintenance menu — removed, prototype Jul 2026), each device shows its single active maintenance agreement — tier (Silver 8×5 NBD · Gold 24×7 ND), servicing partner, period and expiration — above the full list of its previous agreements, sorted latest to oldest. Renewals surface ahead of time (master PRT-2). Specified in the Maintenance PRD (SPEC-PRD-MNT, MNT-1/2).

PTL-4

Service & messaging — tickets are the single Service conversation surface: each ticket carries engineer visit scheduling and the message thread with RiverSync support or the servicing partner. Messages is merged into Tickets (prototype Jun 2026) — there is no separate Messages menu; the conversation lives inside the ticket. A customer opens a new ticket from the command bar through a comprehensive composer — affected device, category → sub-category, priority, subject & message, and image / log attachments — with live RiverSync Assist (suggested classification with one-click apply, mentioned-device detection, similar tickets, a recommended runbook); the opener and classification are recorded (OpenedByParty=customer, DM-60). The build-ready design of this multi-party surface — reused by the Admin (agent) and Partners apps — is specified in SPEC-UIX-TKT (entities ServiceTicket · TicketMessage, rules DM-55/56/60, SVC-19).

PTL-5

Role-gated — what a member sees and controls (acknowledge, configure, control equipment, firmware) follows the Portal column of Account's permission matrix.

PTL-6

Family & model identity — every device is shown with its family (Frigo · Koelkast · Nevera), model and serial. The family reads as the canonical family badge (PRO-17, SPEC-PRD-PRO §3) — capability-axis glyph on the family hue with the capability tooltip — never a generic icon or a text-only label. The device list is a card view — each card is a considered at-a-glance summary (not the full device detail): the header carries identity, status, family and firmware; a schema-aware telemetry panel shows the family's key readings with sparklines (refrigeration: return-air, supply-air & ambient temperature, humidity, power and efficiency; converged/Nevera: return, supply, ambient, PUE, power and battery); and a right rail organises the maintenance agreement (tier, servicing partner, term-progress bar and expiry) and active-alarm state (count + top alarms). Sorting and filtering live in dropdowns on the right of the device command bar. Sorting offers needs-attention · id · status · active alarms · site · family · model · firmware · agreement-expiry · commissioned with an order toggle; the list is paged. Filtering — built on the design-system form controls — covers family, status, one or more sites (tag autocomplete), maintenance tier and active-alarm state, plus free-text search which lives inline in the command bar as an autocomplete combobox (to the left of Sort): typing matches up to seven devices by id / model / site / serial — arrow keys navigate, Enter opens the highlighted device, Esc / ✕ clears — while the same text narrows the card grid live. The customer never needs to know about schema versions; the Portal resolves them. The build-ready detail of the command bar, sort/filter dropdowns and card is SPEC-UIX-DEV.

PTL-7

Schema-aware telemetry — metric and field sets differ per family, model and schema version (e.g. Nevera carries fields Frigo does not, and multi-module units report per module). The Portal renders the correct metric set for each device. A device whose schema is uncataloged or unregistered degrades gracefully: identity and connection state still show, its readings are marked unavailable rather than guessed, and it is flagged for RiverSync to catalog — never silently null-mapped or dropped.

PTL-8

Device twin visibility — each device shows its reported state (firmware version, operating mode, current setpoints) and, where permitted, its desired configuration. Configuration changes (setpoints, mode, firmware) are role-gated commands (PTL-5), always audited, and reconcile against the twin's reported state.

PTL-9

Connection state — online/offline, last-seen and link health come from the connection stream. Offline devices are visibly distinct, telemetry gaps are explained by connection loss rather than read as zeroes, and a device going offline can itself raise an alert (PTL-2). The Portal's own live telemetry feed (a WebSocket) carries its state in a command-bar Live / Offline indicator: online it is success-toned and the broadcast icon pulses; offline it is neutral and static, and all real-time motion pauses (card tile tweens and sparkline streaming hold their last value — nothing is read as zero). Presentation, cadence and the reduced-motion / hidden-tab pausing are specified in SPEC-UIX-DEV §6.

PTL-10

History — telemetry is browsable over selectable time windows (with the time-series brush). On device detail the brush drives the whole multi-metric stack at once (PTL-1) — dragging it selects one period across every pane and pauses the live feed. The prototype simulates a continuous 3-year record per device at adaptive resolution (dense recent, coarse far back), so a scale from 5m to 3y reads the same history — fine live detail up close, seasonal cycles across years. History depth follows the time-series store's retention; any gap from the legacy-store cutover is surfaced, not hidden. Data export is not offered — the Portal provides no telemetry or device-inventory export function.

PTL-11

Service scheduling — the customer agrees the visit time. The Portal's Schedule surface lets the customer (a) set standing scheduling preferences — preferred service windows, blackout dates and a minimum lead time, org-wide or per site — and (b) review the time options RiverSync proposes for each corrective, maintenance or preventive visit and select one (or decline all and request alternatives). The selected slot schedules the visit for Field execution. The propose → select model and its entities are specified in SPEC-PWF-SCH (VisitProposal · VisitProposalOption · SchedulingPreference, DM-57…59); the counterpart sides are Admin ADM-7 (RiverSync proposes) and Partners PAR-15 (the servicing partner works its assigned visits within scope). The surface is the shared PV.Schedule engine (persona=customer), specified in SPEC-UIX-SCH. Acting — setting preferences, accepting a slot — is role-gated to Editor or above (PTL-5); all four roles can view the schedule.

RiverSync Co., Ltd. · BangkokSPEC-APP-PTL · 1 of 2

4Navigation & menu visibility

Portal is customer-facing (entitlement: customer tenant — master AUTH-2). Partner members service devices in Partners; riversync staff monitor every customer's devices in the Operations console (the staff side of Portal). The sidebar below is the shell HUB_NAV model; Devices is the landing surface (no dashboard). Every customer role (Owner · Administrator · Editor · Viewer) sees the whole sidebar — Portal gates by action within a surface (PTL-5), not by hiding menu items — so the matrix reads Full vs read-only rather than hidden. Capabilities follow the Portal column of Account's permission matrix (SPEC-APP-ACC ACC-2).

Full visible, can act Read visible, read-only — hidden & blocked on direct visit
Menu itemOwnerAdminEditorViewer
Monitoring
DevicesFullFullFullRead
Support
ScheduleFullFullFullRead
TicketsFullFullFullFull

Within Devices, Editor can configure and set thresholds but cannot control equipment or push firmware (Owner / Admin only) — the cell reads Full for the surface, with those two commands reserved. Site locations are managed entirely in Account (ACC-1) and are not a Portal surface — the Portal carries no Site Locations page; each device shows its site as read-only context only (devices group and filter by site, PTL-6).

RiverSync Co., Ltd. · BangkokSPEC-APP-PTL · 2 of 2

5Open questions

6Revision history

VersionDateChanges
0.112 Jun 2026Initial draft — scope and five requirements from the platform model
0.213 Jun 2026Vocabulary — fleet → devices: lead and PTL-1 now read "device monitoring" (SPEC-PRD v0.12); requirements otherwise unchanged
0.326 Jun 2026Telemetry grounding + device taxonomy. Added §1 device families/models (Frigo · Koelkast · Nevera, six models — Nevera new, Device Model enum updated in SPEC-ERD; further cascade logged as an open question) and §2 telemetry data source (three IoT streams — telemetry · device twin · connection — and the time-series store, referencing SPEC-DDD-DVC / SVC-9). PTL-1 expanded (per-module readings, live stream). New requirements PTL-6…10: family/model identity, schema-aware telemetry for the heterogeneous fleet, device-twin visibility, connection state, history & export. PTL-2…5 meaning unchanged.
0.426 Jun 2026Maintenance menu. PTL-3 reworked: the Portal surface is the Maintenance menu (renamed from Agreement) showing each device's single active maintenance agreement with its expiration above the previous-agreement history (latest→oldest). Detail consolidated into the new Maintenance PRD (SPEC-PRD-MNT). No change to PTL-1/2/4…10.
0.527 Jun 2026Navigation & menu visibility (new §4). Documents the Portal sidebar (shell HUB_NAV) and a role × menu-item visibility matrix for the four customer roles. Records that Portal gates by action within a surface (PTL-5) rather than hiding menu items, with control/firmware reserved to Owner / Admin. Open questions and revision history renumbered §5–§6. No requirement-structure changes.
0.628 Jun 2026Site Locations removed from Portal — sites are an Account-only surface. The Network → Site Locations menu group is dropped from the §4 nav rail and visibility matrix; site management lives solely in Account (ACC-1), and Portal shows a device's site only as read-only context (PTL-6). The shell HUB_NAV model and prototypes are updated to match. No change to the data model — the ERD already records Account as the owner (C·R·U·D) with Portal read-only.
0.729 Jun 2026Messages merged into Tickets. The standalone Messages menu item is removed from §4 (nav rail + visibility matrix); the support/partner conversation now lives inside each ticket (PTL-4). The Service group is Maintenance · Tickets only. Prototype (apps/portal/Portal.html) updated to match. No data-model change — ChatThread/Ticket already share the conversation shape.
0.829 Jun 2026Sidebar group renamed Service → Support. The second nav group (Maintenance · Tickets) is now labelled Support in §4 (nav rail + visibility matrix) and the prototype. Label only — no change to surfaces, requirements or gating.
0.929 Jun 2026Dashboard removed — Devices is the landing surface. The standalone Dashboard menu item is dropped from the §4 nav rail and visibility matrix; the Portal now opens on Devices. PTL-1 reworded ("the device list and per-device telemetry", no dashboard) and PTL-6 ("the device list groups and filters"). Prototype (apps/portal/Portal.html) updated to match — the fleet-overview view and its layout Tweak are removed, default view is Devices, persisted dashboard landings migrate to it. No data-model change; PTL-1/6 IDs unchanged so traceability holds.
0.1029 Jun 2026Service scheduling (PTL-11 added). The Portal's Schedule surface gains the customer side of scheduling \u2014 standing preferences (windows \u00b7 blackout \u00b7 lead time) and accepting one of the time options RiverSync proposes for a corrective / maintenance / preventive visit (or declining all). Specified in the new SPEC-PWF-SCH workflow with entities VisitProposal \u00b7 VisitProposalOption \u00b7 SchedulingPreference (DM-57\u202659); Admin ADM-7 (propose) and Partners PAR-15 (read-only) are the counterpart sides; master ERD \u00a75 + master PRD updated the same turn. Nav/menu reflection in the prototype is a follow-up.
0.1230 Jun 2026Ticket creation & the comprehensive composer (PTL-4 extended). The Tickets command bar's right-edge primary is now New ticket; it opens a full-width composer (affected device, category → dependent sub-category, priority, details, image/log attachments) in place of the thread reader with the list still visible, plus RiverSync Assist live classification/similar-tickets/runbook suggestions. Expanded the ticket Category set and added SubCategory + OpenedByParty to ServiceTicket (new rule DM-60); the same composer is reused by Admin (ADM-6) and Partners (PAR-14) with role-aware authoring. Cascaded to SPEC-UIX-TKT v1.1, the ERD/Domain/DWF catalogs and the Admin/Partners PRDs the same turn.
0.131 Jul 2026Data export removed (PTL-10 amended). PTL-10 History & export is now History only — telemetry stays browsable over selectable time windows, but the Portal offers no data-export function (neither telemetry nor device inventory); export is not a permitted capability. Prototype (apps/portal/Portal.html) updated the same turn: the Devices command bar's Export command is removed and the page is card view only (the list/table view toggle is dropped) — cards remain sortable, filterable and paged. No data-model change; PTL-10 ID unchanged so traceability holds.
0.141 Jul 2026Device list filtering, sorting & the live feed indicator (PTL-6 detailed). PTL-6 now specifies the Devices surface as a sortable, paged card view with filtering consolidated into a comprehensive Filter dropdown on the command bar — family, status, site, region, maintenance tier and active-alarm-only, plus id/model/serial search. Prototype (apps/portal/Portal.html) updated the same turn: the always-on filter row became the command-bar dropdown, the command-bar icon aligns to the Portal app pill, the redundant “Devices” label is dropped, a live/offline telemetry-feed (WebSocket) indicator sits beside the device icon, and the Filter dropdown anchors to the command bar's right edge. No data-model change; PTL-6 ID unchanged so traceability holds.
0.151 Jul 2026Richer at-a-glance device cards (PTL-6). Each device card is redesigned as a considered at-a-glance summary: a header (identity / status / family / firmware), a schema-aware telemetry panel with sparklines — now including supply-air, return-air and ambient temperature and humidity alongside power and efficiency/PUE — and a right rail that organises the maintenance agreement (tier, partner, term-progress bar, expiry) and active-alarm state. Card telemetry is live — values tween and sparklines stream (~2s cadence, paused when hidden, honouring reduced-motion) so the list simulates real feed data at a glance (PTL-1). An Ambient telemetry reading was added to both the refrigeration and converged schema builders in the prototype dataset (apps/portal/portal-data.js), plus supply-air on the converged card. No relational data-model change (telemetry lives in the time-series store, PTL-1 ⚠); PTL-6 ID unchanged so traceability holds.
0.161 Jul 2026Filter dropdown on design-system controls; Region removed; Sites multi-select. The Filter dropdown is rebuilt on the DS form kit — Select (family, status), Segmented (maintenance tier) and Switch (active-alarms-only) — and Site is now a tag-autocomplete multi-select (each chosen site shows as a removable tag). The Region filter is removed: region is a partner sales-territory concept, not a customer device attribute. Device cards are aligned to the command bar (equal left/right gutters). Prototype updated the same turn. No data-model change; PTL-6 ID unchanged.
0.171 Jul 2026Sort moved to the command bar & expanded; maintenance rail tidied. The Sort control moves to the right of the command bar (left of Filter) and becomes a comprehensive dropdown — an order toggle plus ten fields (needs-attention, id, status, active alarms, site, family, model, firmware, agreement-expiry, commissioned). On the card's right rail the redundant “Maintenance agreement” heading is removed (the tier badge is self-evident) and the tier SLA tooltip is no longer clipped by the card. Prototype (apps/portal/Portal.html) only; no data-model change; PTL-6 ID unchanged.
0.181 Jul 2026Build-ready UI spec + monitoring fine-tuning. A dedicated device monitoring UIX spec (SPEC-UIX-DEV) now specifies the three monitoring surfaces to every control, state and realtime contract; cross-referenced from the header, PTL-6 and PTL-9. Folded the latest prototype fine-tuning into the requirements: PTL-6 records the inline autocomplete search moved into the device command bar (id/model/site/serial, keyboard-navigable, jump-to-device) and the Sort control now reading a plain “Sort” (no selected-field echo); PTL-9 records the command-bar Live / Offline feed indicator (animated broadcast icon) and the online/offline behaviour that pauses all real-time tile/sparkline motion (a prototype Online Tweak simulates feed loss). Added an on-page contents nav. Prototype (apps/portal/Portal.html) is the source of truth; no data-model change (telemetry lives in the time-series store, PTL-1 ⚠); PTL-6/9 IDs unchanged so traceability holds.
0.192 Jul 2026Canonical family badge adopted (PRO-17). The §1 family table and PTL-6 now bind the family identity to the canonical product family badge (SPEC-PRD-PRO §3 — capability-axis glyph, --fam-* hue, capability tooltip). Prototype already composes it (FamilyChip → apps/account/rs-family.js); the pre-badge thermometer / snowflake / server icons are retired. No data-model change; PTL-6 ID unchanged so traceability holds.
0.202 Jul 2026Square device-card chassis (PTL-6, presentation). The inventory card drops its corner radius — square chassis per the shell-chrome idiom — specified in SPEC-UIX-DEV v1.1 §5.2; prototype (apps/portal/portal.css) updated the same turn. No data-model change; PTL-6 ID unchanged so traceability holds.
0.212 Jul 2026Device-detail multi-metric telemetry stack (PTL-1, PTL-10). PTL-1 now specifies the device-detail telemetry as a single full-width TimeSeriesStack card: three shared-time-axis panes — air temperature & humidity (return · supply · ambient air on °C, humidity on %RH), power draw & COP, and a door-access events pane (front · back · side doors, alarm past 5 min) — with event-milestone annotations, a Live / Paused control and a time-scale selector; PTL-10 notes the overview brush drives the whole stack. Prototype landed the same turn (apps/portal/portal-device.jsx · portal-data.js panes/markers · portal-charts.css). Build-ready detail added as SPEC-UIX-DEV §7; new telemetry fields (ambient, COP, door state) reflected in the Devices domain and Master ERD §5. PTL-1/10 IDs unchanged so traceability holds.
0.222 Jul 2026Telemetry stack tuned to the DS reference (PTL-1, presentation). Time-scale set aligned to the design system — 5m · 30m · 1h · 1d · 1mo · 1y · 3y (default 1h); the Events milestones drop door-open (doors own a dedicated pane); the door pane's alarm threshold is 5 min and a single door never opens again while already open (non-overlapping per-door events); the air-temperature pane is taller so the lines aren't cramped. Prototype + SPEC-UIX-DEV §7.1 updated the same turn. No requirement change; PTL-1 ID unchanged.
0.232 Jul 2026Continuous 3-year telemetry record + card header removed (PTL-1, PTL-10). The prototype now simulates one continuous 3-year history per device at adaptive resolution (30s recent → 1-day far back) with a diurnal + seasonal shape, so every scale (5m…3y) reads the same record — fine live detail at 5m, seasonal cycles at 3y. PTL-10 notes the 3-year record; the Telemetry card's header band is removed (the stack's legend/control row is the header). Prototype: portal-data.js seriesLong/cache, portal-device.jsx; SPEC-UIX-DEV v1.4. No requirement change; IDs unchanged.
0.242 Jul 2026Alerts & alarms and Maintenance menus removed — both read on the device detail (PTL-2, PTL-3, §4). The standalone Alerts & alarms and Maintenance sidebar items and their pages are dropped; the sidebar is now Devices · Schedule · Tickets. PTL-2 (acknowledge · cause→effect · open-a-ticket) is served by the device detail's Alarms tab; PTL-3 (single active agreement + history, read-only) by its Maintenance tab. The §4 nav rail + visibility matrix and the caption are updated; cross-app alarm/agreement links (Tickets) now deep-link to the device's Alarms / Maintenance tab, and legacy alerts/maintenance routes redirect there. Prototype (apps/portal/portal-app.jsx, portal-tickets.jsx; portal-alerts.jsx / portal-maintenance.jsx deleted). Capabilities unchanged — only their surface; PTL-2/3 IDs unchanged so traceability holds.
RiverSync Co., Ltd. · BangkokSPEC-APP-PTL · 2 of 2